# 定义Student基类
class Student:
    # 构造方法：初始化公有属性姓名和学号
    def __init__(self, name, number):
        self.name = name  # 公有属性：姓名
        self.number = number  # 公有属性：学号

    # 公有方法：说话（自我介绍）
    def speak(self):
        print(f"我叫{self.name}，学号是{self.number}，是一名学生。")


# 定义Monitor子类（继承自Student）
class Monitor(Student):
    # 构造方法：新增私有属性，同时初始化父类属性
    def __init__(self, name, number, profession, age, course):
        # 调用父类构造方法初始化姓名和学号
        super().__init__(name, number)
        self.__profession = profession  # 私有属性：专业
        self.__age = age  # 私有属性：年龄
        self.__course = course  # 私有属性：学习课程

    # 重写父类的speak()方法
    def speak(self):
        # 不仅包含父类信息，还补充子类私有属性信息
        print(f"我叫{self.name}，学号是{self.number}，是一名班长。")
        print(f"我的专业是{self.__profession}，年龄{self.__age}岁，正在学习{self.__course}课程。")


# 测试代码
if __name__ == "__main__":
    # 创建Student类实例
    student1 = Student("张三", "2023001")
    student1.speak()  # 调用基类speak()

    print("-" * 30)

    # 创建Monitor类实例
    monitor1 = Monitor("李四", "2023002", "计算机科学与技术", 20, "Python编程")
    monitor1.speak()  # 调用重写后的speak()